package haha;

public class Outer {
    private String str = "1 外部类的str";// this.str

    //成员内部类
    class Inner{
        private String str = "2 内部类的str";
        public void say(){
            //内部类访问外部类成员，通过 "外部类类名.this.xxx"
            System.out.println("内部类的变量:"+this.str + "; 外部类的变量:"+Outer.this.str);
        }
    }

    /**
     *  演示局部内部类
     * @param arg
     */
    public void fn(int arg){
        //局部内部类访问局部变量，该局部变量必须本质为final。
        /*final*/ int a = 88;
        class InnerA{
            private String str = "3 内部类的str";
            public void say(){
                //内部类访问外部类成员，通过 "外部类类名.this.xxx"
//                System.out.println("内部类的成员变量:"+this.str + "; 外部类的成员变量:"+Outer.this.str);
                int aa = arg;
                System.out.println(aa);
                aa++;

            }
        }
        new InnerA().say();
    }


    //展示局部匿名内部类:
    public void fn1(Live live){
        live.sleep();
    }

//    static 和 this 是水火不容
    static class InnerB{
        private String str = "4 内部类的str";
        public void fn(){
            System.out.println("静态内部类只能访问外部类的静态成员");
        }
    }
}
